OS: Windows 10
Editor: Visual Studio Code
Rust version: 1.63.0
關於昨天的基本型別的學習資料,下面還有一部分在描寫靜態陣列(static array)與元組型別(tuple) 的,今天繼續下去昨天還沒看完的部分。
先從靜態陣列開始,也就是固定大小的陣列,對於陣列,根據我之前「碰過」,對!是碰過不是學過,碰過其他程式語言的經驗,對於靜態陣列會想知道幾件事:
// 讓compiler知道自己的型別跟大小
let arr = [1, 2, 3, 4, 5];
// 讓我們告訴compiler型別跟大小
let mut arr1: [i32; 5]; // #2
// 讓我們告訴compiler型別跟大小,以及內部資料
let arr2: [i32; 5] = [1, 2, 3, 4, 5];
好奇上面第二個宣告方式,他是會編譯過的,但會回Warning,Rust是否會給予初始值?把其中一個索引值輸出出來看看:
let mut arr1: [i32; 5];
println!("Third element is {}", arr1[2]);
最後Compiler告訴我們error,這是為初始化的陣列:
Compiling basic v0.1.0 (D:\projects\rust_learning\basic)
error[E0381]: use of possibly-uninitialized variable: `arr1`
--> src\main.rs:4:37
|
4 | println!("Third element is {}", arr1[2]);
| ^^^^^^^ use of possibly-uninitialized `arr1`
For more information about this error, try `rustc --explain E0381`.
如果用這樣的方式初始化呢?
let mut arr1: [i32; 5];
arr1[0] = 3;
arr1[1] = 3;
arr1[2] = 3;
arr1[3] = 3;
arr1[4] = 3;
println!("Third element is {}", arr1[2]);
答案還是一樣,compiler會跟我抱怨沒有初始化
warning: variable does not need to be mutable
--> src/main.rs:2:9
|
2 | let mut arr1: [i32; 5];
| ----^^^^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
error[E0381]: use of possibly-uninitialized variable: `arr1`
--> src/main.rs:3:5
|
3 | arr1[0] = 3;
| ^^^^^^^ use of possibly-uninitialized `arr1`
For more information about this error, try `rustc --explain E0381`.
let arr_sz = arr3.len();
// 下面兩個是一樣的意思
let arr4 = [3;5]; // [3, 3, 3, 3, 3]
let arr5: [i32; 5] = [3; 5]; // [3, 3, 3, 3, 3]
假如我需要一個$4 \times 4$的矩陣,為單位矩陣:
let mut mat: [[f64; 4]; 4] = [[0.0; 4]; 4];
mat[0][0] = 1.0;
mat[1][1] = 1.0;
mat[2][2] = 1.0;
mat[3][3] = 1.0;
// PS: 這裡直接先拿範例的code來用
// 明天才會開始學習rust的control flow statements怎麼用
for (i, row) in mat.iter().enumerate() {
for (j, col) in row.iter().enumerate() {
println!("[row={}][col={}]={}", i, j, col);
}
}
最後輸出出來看結果是不是預期的那樣。
範例來自這裡。
Tuple的用法是這樣:
let tup: (f64, bool, i32) = (0.27, false, 129);
解構(destructing)的話會長這樣:
let (x, y, z) = tup;
那x
、y
、z
分別輸出出來就會是0.27
、false
、129
。
要取得特定位置的話,根據下面範例,可以索引出0~2的元素:
let tup: (f64, bool, i32) = (0.27, false, 129);
// 取得index = 1 的值
let second = tup.1;
println!("Value is {}", second);
/*
* output:
* Value is false
*/
這個讓我想到了Tuple能用的情境,可能像Golang一樣,在function中,可以一次回傳多個值。
下面是我上面指的Golang寫法:
// 同時回傳一個int跟錯誤型別
func (v0, v1 int) (int, error) {
// do something
return 0, nil
}